package com.lancoo.cvas.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.lancoo.cvas.entity.Course;
import com.lancoo.cvas.entity.Segment;
import com.lancoo.cvas.entity.TeachingClass;
import com.lancoo.cvas.pojo.vo.*;

import javax.sound.midi.VoiceStatus;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author liufeng
 * @email 1037383243@qq.com
 * @date 2023-12-04 11:54:00
 */
public interface CourseService extends IService<Course> {

    /**
     * 同步课程
     *
     * @param taskId
     * @param courses
     */
    void syncCourse(Integer taskId, Set<Course> courses);

    /**
     * 同步环节
     *
     * @param taskId
     * @param segments
     */
    void syncSegment(Integer taskId, Set<Segment> segments);


    /**
     * 获取未启用的课程列表
     *
     * @param taskId
     * @param courseTypeId
     * @param courseNature
     * @param keyWord
     * @return
     */
    List<AddCourseSegment> getNotEnableCourseList(Integer taskId,String baseTeachingPlanId, String courseTypeId, String classId,Integer courseNature, String keyWord);


    /**
     * 获取未启用的环节列表
     *
     * @param taskId
     * @param keyWord
     * @return
     */
    List<AddCourseSegment> getNotEnableSegmentList(Integer taskId,String baseTeachingPlanId,String classId, String segmentTypeId, String keyWord);


    /**
     * 教学计划增加（课程增开）
     *
     * @param taskId

     * @param courseId
     */
    void courseAdd(Integer taskId, String baseTeachingPlanId,String classId, String courseId, Integer flag,String reserve);


    /**
     * 教学计划增加（环节增开）
     *
     * @param taskId

     * @param segmentId
     */
    void segmentAdd(Integer taskId,String baseTeachingPlanId, String segmentId,String classId, Integer flag,String reserve);


    /**
     * 关闭选定课程
     * @param courseIds
     * @param taskId
     * @return
     */
    Integer closeCourseList(ArrayList<String> courseIds,Integer taskId);


    /**
     * 关闭选中的环节
     * @param segmentIds
     * @param taskId
     * @return
     */
    Integer closeSegmentList(ArrayList<String> segmentIds,Integer taskId);


    /**
     * 初始化教学班参数-所属教学班属于同一教学计划统一课程
     * @param teachingClassList
     */
    void initTeachingClassWeek(List<TeachingClass> teachingClassList);


    /**
     *获取课程/环节类别
     * @param taskId
     * @param flag
     * @return
     */
    List<CourseTypeDto> getCourseTypeByTaskId(Integer taskId, Integer flag);

    /**
     * 通过班级获取本学期启用课程
     * @param taskId
     * @param classId
     * @return
     */
    List<Course> getCourseListByClass(Integer taskId, String classId,String baseTeachingPlanId);

    /**
     * 通过专业获取课程列表
     * @param taskId
     * @param gradeId
     * @param majorId
     * @return
     */
    List<Course> getCourseListByMajor(Integer taskId, String gradeId, Long majorId,String baseTeachingPlanId);

    /**
     * 获取课程类别
     * @param taskId
     * @return
     */
    List<CourseTypeDto> getCourseType(Integer taskId,Integer flag);

    /**
     * 根据班级判断课程启用关闭
     * @param courseIds
     * @param taskId
     * @return
     */
    Integer closeCourseListByClass(CloseCourseDTO closeCourseDTO);

    /**
     * 根据班级判断环节启用关闭
     * @param classId
     * @param segmentIds
     * @param taskId
     * @return
     */
    Integer closeSegmentListByClass(CloseSegmentDTO closeSegmentDTO);

    /**
     * 通过专业和年级获取未开起的课程列表
     * @param taskId
     * @param baseTeachingPlanId
     * @param courseTypeId
     * @param gradeId
     * @param majorId
     * @param courseNature
     * @param keyWord
     * @return
     */
    List<AddCourseSegment> getNotEnableCourseListByMajor(Integer taskId, String baseTeachingPlanId, String courseTypeId, String gradeId, Long majorId, Integer courseNature, String keyWord);

    /**
     * 通过专业和年级获取未开启的环节列表
     * @param taskId
     * @param baseTeachingPlanId
     * @param gradeId
     * @param majorId
     * @param segmentTypeId
     * @param keyWord
     * @return
     */
    List<AddCourseSegment> getNotEnableSegmentListByMajor(Integer taskId, String baseTeachingPlanId, String gradeId, Long majorId, String segmentTypeId, String keyWord);

    /**
     * 添加课程通过专业年级
     * @param taskId
     * @param baseTeachingPlanId
     * @param gradeId
     * @param majorId
     * @param courseId
     * @param flag
     * @param reserve
     */
    void courseAddByMajor(Integer taskId, String baseTeachingPlanId, String gradeId, Long majorId, String courseId, Integer flag, String reserve);

    /**
     * 添加环节通过专业年级
     * @param taskId
     * @param baseTeachingPlanId
     * @param segmentId
     * @param gradeId
     * @param majorId
     * @param flag
     * @param reserve
     */
    void segmentAddByMajor(Integer taskId, String baseTeachingPlanId, String segmentId, String gradeId, Long majorId, Integer flag, String reserve);

    /**
     * 根据专业年级判断课程启用关闭
     * @param closeCourseDTO
     * @return
     */
    Integer closeCourseListByMajor(CloseCourseDTOByMajor closeCourseDTO);

    /**
     * 根据专业年级判断环节启用关闭
     * @param closeSegmentDTO
     * @return
     */
    Integer closeSegmentListByMajor(CloseSegmentDTOByMajor closeSegmentDTO);


    /**
     * 检查教室
     * @param taskId
     * @param roomId
     * @return
     */
    String checkRoom(Integer taskId, Long roomId);

    List<Course> getAllCourse(Integer taskId);
}

